package com.wh.wisdomsite.xbox.utils;

import java.math.BigDecimal;

/**
 * 计算工具类
 * Created by xiekai on 2014/8/7.
 */
public class MathUtil {

    //默认除法运算精度
    private   static   final   int   DEF_DIV_SCALE   =   2;

    private MathUtil(){}

    /**
     * 精确加法运算
     * @param s
     * @return
     */
    public static String add(Object... s) {
        BigDecimal sum = new BigDecimal("0");
        for (Object _s : s){
            BigDecimal bs = new BigDecimal(oTs(_s));
            sum = sum.add(bs);
        }
        return sum.toString();
    }

    /**
     * 精确除法
     * @param a
     * @param b
     * @param scale
     * @return
     */
    public static String divide(Object a, Object b, int scale) {
        BigDecimal _a = new BigDecimal(oTs(a));
        BigDecimal _b = new BigDecimal(oTs(b));
        BigDecimal r = _a.divide(_b,scale,BigDecimal.ROUND_HALF_UP);
        return r.toString();
    }

    /**
     * 精确除法，默认2位小数
     * @param a
     * @param b
     * @return
     */
    public static String divide(Object a, Object b) {
        BigDecimal _a = new BigDecimal(oTs(a));
        BigDecimal _b = new BigDecimal(oTs(b));
        BigDecimal r = _a.divide(_b,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP);
        return r.toString();
    }

    /**
     * 精确乘法
     * @param a
     * @return
     */
    public static String multiply(Object... a) {
        BigDecimal m = new BigDecimal("1");
        for(Object _a : a){
            BigDecimal ba = new BigDecimal(oTs(_a));
            m = m.multiply(ba);
        }
        return m.toString();
    }

    /**
     * 精确减法
     * @param a
     * @param b
     * @return
     */
    public static String subtract(Object a, Object b) {
        BigDecimal _a = new BigDecimal(oTs(a));
        BigDecimal _b = new BigDecimal(oTs(b));
        BigDecimal r = _a.subtract(_b);
        return r.toString();
    }

    public static String oTs(Object o) {
        if(o == null){
//            throw new Exception("不能为空");
        }else if(o instanceof Number){
            return o.toString();
        }else if(o instanceof String){
            try {
                Double d = Double.parseDouble(o.toString());
                return d.toString();
            } catch (Exception e){
//                throw new Exception("不是数字");
            }
        }else{
//            throw new Exception("参数类型不正确");
        }
        return "0";
    }

    public static BigDecimal getMin(BigDecimal[] bigDecimals){
        BigDecimal result = bigDecimals[0];
        for (BigDecimal bigDecimal : bigDecimals) {
            if(result.compareTo(bigDecimal) > 0){
                result = bigDecimal;
            }
        }
        return result;
    }
}
